package multithreading;

public class Demo8_DaemonThread {

    /**
     * 守护线程
     *   线程分类：用户线程   守护线程
     *   守护线程特点
     *     并不是程序中不可或缺的线程，在JVM中地位级别（不是优先级）是最低的线程
     *     如果用户线程全部执行完毕，但守护线程还没有执行完毕，守护线程也没有存在的必要了
     *     一个程序中必须存在至少一个用户线程
     *     GC垃圾回收机制就是一个守护线程
     * 优先级
     *   表示线程执行的优先程度，用 1-10的整数表示优先级的高低
     *
     */
    public static void main(String[] args) {

        //如果定义两个线程都是用户线程，两个线程的内容都必须全部执行完毕JVM才结束
        Thread thr_a = new Thread(new OutputNum(100),"first");
        Thread thr_b = new Thread(new OutputNum(1000),"second");
        //如果设置某个线程为守护线程，只要所有的用户线程执行完毕直接关闭JVM
        thr_b.setDaemon(true);


        //在主线程中获取线程的优先级
        System.out.println(thr_a.getPriority());
        System.out.println(thr_b.getPriority());

        thr_a.start();
        thr_b.start();
    }



}

class OutputNum implements Runnable{

    int sum;

    public OutputNum(int sum) {
        this.sum = sum;
    }

    @Override
    public void run() {

        try{
            //在线程执行过程中获取优先级
            System.out.println(Thread.currentThread().getPriority());

            while(true){
                if(sum<0){
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"线程："+ (sum--));
                Thread.sleep(100);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}
